跳到主要内容

MySQL 数据库备份与恢复

基本命令

恢复数据导出数据这些虽然有 IDE 能帮忙操作,但是一般都是用的命令行,所以这篇笔记从命令开始

连接 MySQL

# 注意,本地至少安装了 mysql 的客户端
mysql -h主机地址 -u用户名 -p用户密码

# 如果没有安装则先安装一下
apt install mysql-client-5.7

下面的命令都是进入 MySQL 控制台后执行的

显示数据库列表

1、显示数据库列表:

show databases;

显示的效果如下:

注意刚开始时才两个数据库:mysql 和 test,其中 mysql 库很重要它里面有 MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。

2、显示库中的数据表:

use mysql;  --打开库
show tables;

3、显示数据表的结构:

describe 表名;
-- 简写:desc 表名

删库命令~

删库和删表:

drop database 库名;
drop table 表名;

将表中记录清空(只删数据):

delete from 表名;

数据备份

备份:从数据库导出数据

格式:

# 导出工具          (大写 P)                     表可以省略(那就是全部表)      
mysqldump -h主机地址 -P端口 -u用户名 -p密码 数据库名 表名 > d:XX.sql # 路径

示例:(注意,这个 any 是数据库的名称)

mysqldump -hlocalhost -P3306 -uroot -proot any > C:/Users/alsritter/Desktop/db/test.sql

但是可以发现导出的数据是编码错误的

可以先通过这个命令检查默认编码

-- 查看全局的编码
show variables like 'character%';

-- 单独查看 mysql数据库编码方式:
show create database mydatabase;

-- 单独查看表的编码方式:
show create table <表名>;

可以看到创建数据库的编码方式是

所以需要指定导出的数据编码,即加上下面这个参数

--default-character-set=数据库编码

再次导出数据,这里要使用 GBK 导出数据

# 如果里面存在 BINARY, VARBINARY, BLOB 类型的数据 要加 --hex-blob 选项
# 只返回特定数据库中特定表格的数据,不返回表格结构,可以添加 -t 命令参数
# 导出特定数据库的所有表格的表结构及其数据,添加 --databases 命令参数
mysqldump --default-character-set=gb2312 -hlocalhost -P3306 -uroot -proot --databases any > C:/Users/alsritter/Desktop/db/temp01.sql


# 导出表结构和满足挑顶条件的表数据——只返回特定数据库中特定表的表格结构和满足特定条件的数据
mysqldump -hlocalhost -P3306 -uroot -proot mydatabase mytable --where=" ctime>'2017-01-01' and ctime<'2017-06-30'" > temp02.sql

备份:查询的方式取得数据

mysql  --default-character-set=utf8 -u username -p passwd -h host -P port -D mydatabase -e " select * from tableName" > testexport.txt

恢复导入数据库数据

系统命令行

# 语法
mysql -h链接ip -P(大写)端口 -u用户名 -p密码 数据库名 < d:XX.sql(路劲)

# 使用例
mysql -uusername -ppassword db1 <tb1tb2.sql

MySQL 命令行的方式

user db1;
source tb1_tb2.sql;

恢复整个数据库的方法:

mysql -uusername -hlocalhost -ppw -P3306  < all_database.sql

MySQL 回滚数据

上面说了这么多都是导出数据的方法,那 MySQL 误操作后如何快速恢复数据?

使用事务安全操作

始于 BEGIN; 终于 ROLLBACK / COMMIT;

  • 啥也别说运行一次 BEGIN;
  • 执行 增/删/改 sql语句,然后使用 select 查看是否操作正确;
  • 如果正确运行一次 COMMIT; 否则运行一次 ROLLBACK;

举个例子:

操作之前的数据:

SELECT * from sys_user where id = 2 ;

-- 结果:2 123456 mshu 123456 11855079819 2018-04-30 11:41:03 无不良记录 100 100

ROLLBACK 使用

BEGIN;
DELETE FROM sys_user where id = 2;
SELECT * from sys_user where id = 2 ;
-- 结果:空
ROLLBACK;
SELECT * from sys_user where id = 2 ;
-- 结果:2 123456 mshu 123456 11855079819 2018-04-30 11:41:03 无不良记录 100 100

COMMIT 使用

BEGIN;
DELETE FROM sys_user where id = 2;
SELECT * from sys_user where id = 2 ;
-- 结果:空
COMMIT;
SELECT * from sys_user where id = 2 ;
-- 结果:空

人都是懒惰的,每次操作sql,都要运行BEGIN;ROLLBACK / COMMIT实在太麻烦,当遇到概率事件时,人们往往会把有利于自己的一边的概率放大。 ——Mshu

Mysql 是有日志记录功能的,但是默认关闭,就像著名哲学家 Mshu 说的那样,Mysql 也认为误操作是个概率事件,如果记录操作日志的话,时间久、频率高就会需要很大的空间,而且用不到的话就是一堆垃圾,所以它放小了不利自己的概率,认为没有必要开启。

开启 logbin

使用 MySQL 的日志记录功能,首先要确定是否开启了 logbin

-- 使用这条命令检查一下是否开启了
show variables like '%log_bin%'

看输出结果可以看到默认并没有打开 log_bin

怎么开启?

如果没有开启需要修改 my.ini 文件

注意:Windows下 MySQL 的配置文件是 my.ini,一般会在安装目录的根目录。而 Linux 下 MySQL 的配置文件是 my.cnf,一般会放在 /etc/my.cnf/etc/mysql/my.cnf

如果找不到这个文件可以使用 SQL 命令来找

-- 它在显示的 datadir 指向的文件夹里
show variables like '%data%'

然后在 my.ini 里面加上

# Binary Logging.
# log-bin
log-bin=mysql-log
# 等号后面随便取,这将会是你的日志文件名,如我所取 mysql-log

重启服务器

重启之后操作一番增删改后,可以看到日志文件,目录就在 show variables like '%data%' 显示的 datadir 指向的文件夹里

这就是 MySQL 的日志文件。

针对日志文件的命令

命令作用
flush logs至此生成新的日志文件
reset master清空日志文件

注意,得保证下面两个条件:

  • 存储引擎:InnoDB
  • 日志格式:ROW

不过一般默认就是这两个

查看存储引擎

show engines;

查看日志格式

show variables like '%binlog_format%';

mysqldump 参数说明

TODO: binlog 备份?回滚?

TODO: mysqlbinlog 命令

References